import api from '@/service'
import { ref } from 'vue'
import type { IUserInfo } from '@/types/user'

export default function useLogin() {
  const userInfo = ref<IUserInfo | null>({
    userName: 'xxxxxxxxxxx',
    avatar: '',
    phone: null,
    points: 0,
    userRequests: null,//如果null或者[]登录后跳转目的地搜集页面
    memberCard:null,
    // memberCard: {
    //   cards: null,
    //   effectiveDate: '2025-05-14',
    //   expirationDate: "2026-05-13",
    //   name: '环形操年卡',
    //   status: "2",
    // },
    timeCard:null,
    trialCard: null,
  });
  
  const TOKE_CACHE_KEY = "token";
  const EXPIRES_CACHE_KEY = "expiresIn";
  const USERINFO_CACHE_KEY = "userinfo";


  const _gotoLogin = () => {
    // 判断本页面是否为登录页面，如果为登录页则不跳转，否则跳转到登录页面
    const currentPage = getCurrentPages().pop()?.route;
    if (currentPage === 'pages/login/index') return;
    uni.navigateTo({
      url: '/pages/login/index',
    });
  }

  // 计算过期时间，返回单位毫秒
  const _getExpiresTime = (expiresIn:string) => {
    // 计算过期时间，返回单位毫秒
    return new Date().getTime() + parseInt(expiresIn);
  }

  
  /**
   * 检查用户是否已登录
   *
   * @param customRedirctUrl 是否使用自定义重定向URL，默认为false
   * @returns 如果用户已登录，则返回true；如果用户未登录且未提供自定义重定向URL，则跳转到登录页面并返回false；如果用户未登录但提供了自定义重定向URL，则返回false
   */
  const checkLogin = async (customRedirctUrl?: boolean) => {
    console.log(ifLoginExpired());
    if (ifLoginExpired()){
      if (!customRedirctUrl) {
        _gotoLogin();
      }
      return false;
    } else {
      // 如果已经登录了，则获取用户信息并判断是否
      const res:any = await getUserInfo();
      if (res && res.status === 200 && res.data) {
        if (
          (userInfo.value && userInfo.value?.userRequests === null) ||
          (userInfo.value && userInfo.value.userRequests && userInfo.value.userRequests.length <= 0)
        ) {
          _gotoLogin();
          return false;
        } else {
          return true;
        }
      } else {
        return false;
      }
    }
  }

  /**
   * 获取用户信息
   *
   * 通过调用API接口获取用户信息，并更新全局的用户信息对象。
   *
   * 如果成功获取用户信息，则将用户信息更新到全局变量userInfo中，并将更新后的userInfo存储到本地缓存中。
   * 如果获取用户信息失败，则将全局变量userInfo置为null，并清空本地缓存中的用户信息。
   */
  const getUserInfo = async () => {
    const res = await api.user.getUserInfo()
    if (res && res.status === 200) {
      //此处需要处理用户信息更新逻辑，目前测试直接写死  如果会员卡等
      console.log("更新本地用户信息");
      userInfo.value = {
        ...userInfo.value,
        userId:  ((res && res.data?.userDetails?.userId) || '') || '',
        userName: ((res && res.data?.userDetails?.userName) || '') || '',
        avatar: ((res && res.data?.userDetails?.avatar) || '') || '',
        phone:  ((res && res.data?.userDetails?.phoneNumber) || '') || '',
        points: ((res && res.data?.userDetails?.points) || 0) || 0,
        userRequests: res?.data?.userDetails?.userRequests || null,
        memberCard: res?.data?.userDetails?.userCard?.memberCard || null,
        timeCard: res?.data?.userDetails?.userCard?.timeCard || null,
        trialCard: res?.data?.userDetails?.userCard?.trialCard || null,
      }
      console.log(userInfo.value);
    } else {
      userInfo.value = null;
    }
    uni.setStorageSync(USERINFO_CACHE_KEY, userInfo.value);
    return res;
  }

  /**
   * 手机用户登录函数
   *
   * @param code 登录凭证
   * @param jsCode 微信小程序提供的js_code，可选参数
   * @param referrer 跳转来源，可选参数
   * @returns 登录接口的响应结果
   */
  const login = async (code: string,jsCode?:string, referrer?: string) => {
    console.log(code);
    const res = await api.user.login({ code,jsCode, referrer })
    console.log("kkkk");
    if (res && res.status === 200) {
      const token = res?.data?.token || ''; // 假设返回数据结构为 { data: { token: string } }
      const expiresIn = res?.data?.expiresIn || ''; // 假设返回数据结构为 { data: { expiresIn: string } }
      uni.setStorageSync(TOKE_CACHE_KEY, token||'');
      uni.setStorageSync(EXPIRES_CACHE_KEY, _getExpiresTime(expiresIn) || 0);
    }
    return res;
  }

  /**
   * 自动登录函数
   *
   * @param code 登录凭证
   * @returns 登录结果
   */
  const autoLogin = async (code:string) => {
    const res = await api.user.autoLogin(code);
    if (res && res.status === 200 && res?.data && res?.data?.token) {
      const token = res?.data?.token || ''; 
      const expiresIn = res?.data?.expiresIn || '';
      console.log("自动静默登录成功，token为："+token);
      uni.setStorageSync(TOKE_CACHE_KEY, token||'');
      uni.setStorageSync(EXPIRES_CACHE_KEY, _getExpiresTime(expiresIn) || 0);
      getUserInfo();
    } else {
      console.log("自动静默登录失败");
    }
    return res;
  }
  
  /**
   * 判断用户登录是否过期
   *
   * @returns 如果用户登录已过期返回 true，否则返回 false
   */
  const ifLoginExpired = () => {
    const expiresIn = uni.getStorageSync(EXPIRES_CACHE_KEY) || 0;
    const token = uni.getStorageSync(TOKE_CACHE_KEY) || '';
    // 如果没有token,或者过期时间小于当前时间，则认为是过期的
    if (!token || expiresIn === '0' || new Date().getTime() - 1 * 60 * 1000 > Number(expiresIn)) {
      return true;
    }
    return false;
  }

  /**
   * 更新用户信息
   *
   * @param userName 用户名
   * @param avatar 头像链接
   * @param userRequests 用户请求数组，可以为空数组、空对象或null
   * @returns 返回更新用户信息的响应结果
   */
  const updateUserInfo = async (userName: string,avatar:string,userRequests?:string[]|[]|null) => {
    const res = await api.user.updateUserInfo( userName, avatar, userRequests);
    if (res && res.status === 200) {
      userInfo.value = {
        ...userInfo.value,
        userName:res?.data?.userDetails?.userName || '',
        avatar:res?.data?.userDetails?.avatar || '',
        userRequests:res?.data?.userDetails?.userRequests || [],
      }
    }
    return res;
  }

  return {
    userInfo,
    checkLogin,
    getUserInfo,
    updateUserInfo,
    autoLogin,
    login,
    ifLoginExpired,
    TOKE_CACHE_KEY,
    USERINFO_CACHE_KEY,
    EXPIRES_CACHE_KEY,
  }
}
